ACMで発行した証明書の検証で使うCNAMEレコードを削除してみた
削除してしまったらどうなるんだろう
こんにちは、のんピ(@non____97)です。
皆さんはACMで発行した証明書の検証で使うCNAMEレコードを削除するとどんな挙動をするのか気になったことはありますか? 私はあります。
AWS公式ドキュメントを確認すると以下のような記載がありました。
自動更新を停止するには、関連付けられている AWS サービスから証明書を削除するか、CNAME レコードを削除します。
見たところ自動更新が止まるだけで、証明書が直ちに失効する訳ではなさそうです。
ただ、今までやったことなかったので、実際にACMで発行した証明書の検証で使うCNAMEレコードを削除してみました。
いきなりまとめ
- 検証した限り、ACMで発行した証明書の検証で使うCNAMEレコードを削除しても、直ちに証明書が失効する訳ではない
- CNAMEレコードがない状態で期限を迎えると、証明書の自動更新がされないので放置は禁物
検証環境
検証環境は以下の通りです。
ACMで発行した証明書の検証で使うCNAMEレコードをRoute 53のPublic Hosted Zoneに登録します。
また、NLBのターゲットにNAT GatewayへのルーティングないEC2インスタンスを指定したことがなかったので、NLBでTLSリスナーを使用しています。
NLBに対して警告なくHTTPSでアクセスできることを確認した上で、検証用のCNAMEレコードを削除し、再度警告なくHTTPSでアクセスできることを確認します。
検証環境の構築
検証環境の構築はほぼAWS CDKで行います。
使用したコードは以下リポジトリに保存しています。
npx cdk deploy
で各種リソースをデプロイします。
途中、Public Hosted Zoneの作成が完了したら、作成したPublic Hosted ZoneのNSレコードを上位のDNSサーバーに登録します。
私の場合、検証で使用するacm-test.non-97.net
の上位のドメインであるnon-97.net
はGoogle Domainsで管理しているので、Google DomainsのDNSにNSレコードを追加します。
Public Hosted ZoneのNSレコードの追加が完了すると、処理が進みます。
デプロイ後、Public Hosted ZoneにACMで発行した証明書の検証で使うCNAMEレコードと、NLBのALIASのAレコードがあることを確認します。
また、ACMから発行した証明書のステータスが発行済み
であることを確認します。
HTTPSで通信できることを確認
それではNLBにHTTPSで通信できることを確認します。
ブラウザで `https://acm-test.non-97.net` にアクセスするとNginxのテストページが警告なく表示されました。
証明書ビューアから使用されている証明書も確認してみます。
CNが有効期限が発行日の1年後になっていることが分かります。
OpenSSLを使ってコマンドからも証明書を確認してみます。
> echo | openssl s_client -connect acm-test.non-97.net:443 CONNECTED(00000005) depth=4 C = US, O = "Starfield Technologies, Inc.", OU = Starfield Class 2 Certification Authority verify return:1 depth=3 C = US, ST = Arizona, L = Scottsdale, O = "Starfield Technologies, Inc.", CN = Starfield Services Root Certificate Authority - G2 verify return:1 depth=2 C = US, O = Amazon, CN = Amazon Root CA 1 verify return:1 depth=1 C = US, O = Amazon, OU = Server CA 1B, CN = Amazon verify return:1 depth=0 CN = acm-test.non-97.net verify return:1 --- Certificate chain 0 s:/CN=acm-test.non-97.net i:/C=US/O=Amazon/OU=Server CA 1B/CN=Amazon 1 s:/C=US/O=Amazon/OU=Server CA 1B/CN=Amazon i:/C=US/O=Amazon/CN=Amazon Root CA 1 2 s:/C=US/O=Amazon/CN=Amazon Root CA 1 i:/C=US/ST=Arizona/L=Scottsdale/O=Starfield Technologies, Inc./CN=Starfield Services Root Certificate Authority - G2 3 s:/C=US/ST=Arizona/L=Scottsdale/O=Starfield Technologies, Inc./CN=Starfield Services Root Certificate Authority - G2 i:/C=US/O=Starfield Technologies, Inc./OU=Starfield Class 2 Certification Authority --- Server certificate -----BEGIN CERTIFICATE----- MIIF4DCCBMigAwIBAgIQCzQwXVwmuQn4/9n9ggUeVjANBgkqhkiG9w0BAQsFADBG MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRUwEwYDVQQLEwxTZXJ2ZXIg Q0EgMUIxDzANBgNVBAMTBkFtYXpvbjAeFw0yMjA5MjIwMDAwMDBaFw0yMzEwMjIy MzU5NTlaMB4xHDAaBgNVBAMTE2FjbS10ZXN0Lm5vbi05Ny5uZXQwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQC1s9N5nkPCy6K4MptHpOj1WoT1vZEiI210 oMT3kHqTIgUObVem7Cj+JeeEL2DfH/1MagNdRHIf8Ph3saer7HT8IHL1bo2wryvb bd2f3/hoZon9cR59RXe7wCJ8cItUCJ2ZdOWCY2hTvodh5qrsSV5iB5xIGjHJK7PR 1YpXo7/Tj07WF15hj0H+nC3OHIMWlF5vwdWHk6SB/D+JjRjJw9jjsTirJQeMYVRx oIyyVsWpdCKs4dYUHScYeBRtpW1llJX3BZ0BxQtK3D+eoUUzOhMC5v0yhSdomtB1 04c2oOOF5xLghvS9qEJ9rpS7qyyNAWbGyjZc4ZWvnXtgh7VwcvOpAgMBAAGjggLw MIIC7DAfBgNVHSMEGDAWgBRZpGYGUqB7lZI8o5QHJ5Z0W/k90DAdBgNVHQ4EFgQU RkrH8/sAphge94ppx6ibCi990A4wHgYDVR0RBBcwFYITYWNtLXRlc3Qubm9uLTk3 Lm5ldDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUF BwMCMD0GA1UdHwQ2MDQwMqAwoC6GLGh0dHA6Ly9jcmwuc2NhMWIuYW1hem9udHJ1 c3QuY29tL3NjYTFiLTEuY3JsMBMGA1UdIAQMMAowCAYGZ4EMAQIBMHUGCCsGAQUF BwEBBGkwZzAtBggrBgEFBQcwAYYhaHR0cDovL29jc3Auc2NhMWIuYW1hem9udHJ1 c3QuY29tMDYGCCsGAQUFBzAChipodHRwOi8vY3J0LnNjYTFiLmFtYXpvbnRydXN0 LmNvbS9zY2ExYi5jcnQwDAYDVR0TAQH/BAIwADCCAYAGCisGAQQB1nkCBAIEggFw BIIBbAFqAHcA6D7Q2j71BjUy51covIlryQPTy9ERa+zraeF3fW0GvW4AAAGDY4q+ ZgAABAMASDBGAiEA+caqt8dPW+aKG9J0C8tba+xHUfHOGnS4FnbH5Kmr7WACIQDu ev2HLQ8g1nWqwnQnkV6Q+tXWp/eFUnSlWE6XPrsCQwB2ADXPGRu/sWxXvw+tTG1C y7u2JyAmUeo/4SrvqAPDO9ZMAAABg2OKvqoAAAQDAEcwRQIhAIQnzovE3DxDH4+X gGA+tT8dfp2UCvLXCm4S/Ct21wtOAiAW0Yzxr1DLPeQisJ8OOSKJjrnSZ0BZa8B9 thZbiJU3ggB3ALNzdwfhhFD4Y4bWBancEQlKeS2xZwwLh9zwAw55NqWaAAABg2OK vt0AAAQDAEgwRgIhAJNdldUWVR+pcYXKSOyelwyam/YbyJO9moGprOwgtvAbAiEA lwHflWLrgRnAAnVMrzbGrxoM9ScatDjczOfk/JA1YyswDQYJKoZIhvcNAQELBQAD ggEBAISfUr9BgbA6ZNfy+GbfMcGHSEsD/vTJ6tMLeNOXCSUqr8RRiCOLW6isuKTj YgZjUBjxdjwF6awBYoGO6GwWgSgPWq6w1/dDZx8cZ+6dXBwOyHp3KT4ozaA3bDaA Vm2RAz+gDmsd5FNhNfsEJOTZJ2CPcE3WmkFB5uhlte0+Vr+dF6JypeV11/px2qnx IU+2v+4+IKv0J7JqALm0faTTDy3BS+9Sp29zM78Lv8LZjiBYzG0LJR+YlQsuRZnG dJu3udqsx3VwXPhZ7dvjj7Qr/cHkoDtLxrYTPIGwHHXJhVN+euhnk8jGeAKDIyIO 1ZbmQ8xbheSGYSSj8yiWQ19Zrko= -----END CERTIFICATE----- subject=/CN=acm-test.non-97.net issuer=/C=US/O=Amazon/OU=Server CA 1B/CN=Amazon --- No client certificate CA names sent Server Temp Key: ECDH, X25519, 253 bits --- SSL handshake has read 5532 bytes and written 289 bytes --- New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256 Server public key is 2048 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE No ALPN negotiated SSL-Session: Protocol : TLSv1.2 Cipher : ECDHE-RSA-AES128-GCM-SHA256 Session-ID: 2B5570C16BEB0A42B95364A401EF68FFA3D7419763D4E485886B518E39379C41 Session-ID-ctx: Master-Key: 6AC78D962DDF853F11153395D807EB0C2AC0010EE18078092CC444D859941185236BD6DF253A4D4A72D9041A2C698B9D TLS session ticket lifetime hint: 172800 (seconds) TLS session ticket: 0000 - 53 53 4b 2d 45 30 30 34-36 32 31 36 31 00 00 00 SSK-E00462161... 0010 - 9c 93 61 d4 f3 39 d1 f6-1c f1 e7 58 8b 0e 8a b1 ..a..9.....X.... 0020 - a7 51 82 ce 33 62 b3 fa-fc ae 3f 99 b5 83 40 91 .Q..3b....?...@. 0030 - 67 c4 90 99 c7 06 e9 0b-c6 b4 ae 36 fd e6 48 b1 g..........6..H. 0040 - 04 33 60 9c 26 b2 1c d9-05 8b ca 93 40 12 f5 9a .3`.&.......@... 0050 - c6 03 c2 bf ef 2f 68 b3-f6 32 de 74 3f 45 80 ac ...../h..2.t?E.. 0060 - d8 97 2b 5e 86 2b 7f 81- ..+^.+.. Start Time: 1663828193 Timeout : 7200 (sec) Verify return code: 0 (ok) --- DONE
ニヤニヤしますね。
コマンドつながりでcurlを使ってアクセスしてみます。
> curl https://acm-test.non-97.net/ -v * Trying 52.0.220.125:443... * Connected to acm-test.non-97.net (52.0.220.125) port 443 (#0) * ALPN, offering h2 * ALPN, offering http/1.1 * successfully set certificate verify locations: * CAfile: /etc/ssl/cert.pem * CApath: none * (304) (OUT), TLS handshake, Client hello (1): * (304) (IN), TLS handshake, Server hello (2): * (304) (IN), TLS handshake, Unknown (8): * (304) (IN), TLS handshake, Certificate (11): * (304) (IN), TLS handshake, CERT verify (15): * (304) (IN), TLS handshake, Finished (20): * (304) (OUT), TLS handshake, Finished (20): * SSL connection using TLSv1.3 / AEAD-AES128-GCM-SHA256 * ALPN, server did not agree to a protocol * Server certificate: * subject: CN=acm-test.non-97.net * start date: Sep 22 00:00:00 2022 GMT * expire date: Oct 22 23:59:59 2023 GMT * subjectAltName: host "acm-test.non-97.net" matched cert's "acm-test.non-97.net" * issuer: C=US; O=Amazon; OU=Server CA 1B; CN=Amazon * SSL certificate verify ok. > GET / HTTP/1.1 > Host: acm-test.non-97.net > User-Agent: curl/7.79.1 > Accept: */* > * Mark bundle as not supporting multiuse < HTTP/1.1 200 OK < Server: nginx/1.20.0 < Date: Thu, 22 Sep 2022 05:51:11 GMT < Content-Type: text/html < Content-Length: 3520 < Last-Modified: Tue, 12 Jul 2022 01:09:57 GMT < Connection: keep-alive < ETag: "62ccc9e5-dc0" < Accept-Ranges: bytes < <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <title>Test Page for the Nginx HTTP Server on Amazon Linux</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <style type="text/css"> /*<![CDATA[*/ body { background-color: #fff; color: #000; font-size: 0.9em; font-family: sans-serif,helvetica; margin: 0; padding: 0; } :link { color: #c00; } :visited { color: #c00; } a:hover { color: #f50; } h1 { text-align: center; margin: 0; padding: 0.6em 2em 0.4em; background-color: #294172; color: #fff; font-weight: normal; font-size: 1.75em; border-bottom: 2px solid #000; } h1 strong { font-weight: bold; font-size: 1.5em; } h2 { text-align: center; background-color: #3C6EB4; font-size: 1.1em; font-weight: bold; color: #fff; margin: 0; padding: 0.5em; border-bottom: 2px solid #294172; } hr { display: none; } .content { padding: 1em 5em; } .alert { border: 2px solid #000; } img { border: 2px solid #fff; padding: 2px; margin: 2px; } a:hover img { border: 2px solid #294172; } .logos { margin: 1em; text-align: center; } /*]]>*/ </style> </head> <body> <h1>Welcome to <strong>nginx</strong> on Amazon Linux!</h1> <div class="content"> <p>This page is used to test the proper operation of the <strong>nginx</strong> HTTP server after it has been installed. If you can read this page, it means that the web server installed at this site is working properly.</p> <div class="alert"> <h2>Website Administrator</h2> <div class="content"> <p>This is the default <tt>index.html</tt> page that is distributed with <strong>nginx</strong> on Amazon Linux. It is located in <tt>/usr/share/nginx/html</tt>.</p> <p>You should now put your content in a location of your choice and edit the <tt>root</tt> configuration directive in the <strong>nginx</strong> configuration file <tt>/etc/nginx/nginx.conf</tt>.</p> </div> </div> <div class="logos"> <a href="http://nginx.net/"><img src="nginx-logo.png" alt="[ Powered by nginx ]" width="121" height="32" /></a> </div> </div> </body> </html> * Connection #0 to host acm-test.non-97.net left intact
無事にアクセスできました。
ACMで発行した証明書の検証で使うCNAMEレコードを削除
それでは、ACMで発行した証明書の検証で使うCNAMEレコードを削除してみます。
Route 53のPublic Hosted Zoneから対象のCNAMEレコードを削除します。
CNAMEレコードが削除されたことを確認します。
CNAMEレコード削除後にもHTTPSで通信できることを確認
CNAMEレコード削除後にもHTTPSで通信できることを確認します。
ブラウザで `https://acm-test.non-97.net` にアクセスするとNginxのテストページが警告なく表示されました。
curlからも変わらずアクセスできました。
> curl https://acm-test.non-97.net/ -I HTTP/1.1 200 OK Server: nginx/1.20.0 Date: Thu, 22 Sep 2022 06:45:39 GMT Content-Type: text/html Content-Length: 3520 Last-Modified: Tue, 12 Jul 2022 01:09:57 GMT Connection: keep-alive ETag: "62ccc9e5-dc0" Accept-Ranges: bytes
5分後、10分後、1時間後もアクセスしましたが、警告なく変わらずアクセスできました。
また、ACMからも証明書のステータスは変わらず発行済み
であることを確認できました。
ということで、ACMで発行した証明書の検証で使うCNAMEレコードを削除しても、直ちに証明書が失効する訳ではないことが分かりました。
なお、証明書で指定したFQDNではなく、NLBのDNS名を指定してアクセスすると以下のように怒られます。
> curl https://WebSt-NLB55-IZ08EMHKVF5X-add3381ef9fd3bc4.elb.us-east-1.amazonaws.com -I curl: (60) SSL: no alternative certificate subject name matches target host name 'WebSt-NLB55-IZ08EMHKVF5X-add3381ef9fd3bc4.elb.us-east-1.amazonaws.com' More details here: https://curl.se/docs/sslcerts.html curl failed to verify the legitimacy of the server and therefore could not establish a secure connection to it. To learn more about this situation and how to fix it, please visit the web page mentioned above.
直ちに証明書が失効する訳ではない
ACMで発行した証明書の検証で使うCNAMEレコードを削除した際の挙動を確認してみました。
直ちに証明書が失効する訳ではないので安心ですね。IaCでDNSレコードを管理している場合、どうしても一瞬削除が行われてしまうみたいなケースはあると思うので、参考にしてもらえればと思います。
ただし、CNAMEレコードがない状態で期限を迎えると、証明書の自動更新がされないので放置は禁物です。
この記事が誰かの助けになれば幸いです。
以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!